package com.xhs.service;

import com.xhs.constant.RedisKeyEnum;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @desc:
 * @projectName: spring-boot-redis
 * @author: xhs
 * @date: 2024-06-21 021 14:45
 * @version: JDK 1.8
 */
public interface RedisService {


    /**
     * 将指定实体保存到Redis中，数据格式为字符串
     *
     * @param <T>
     * @return boolean
     */
    <T> boolean saveToString(RedisKeyEnum key, T t);

    /**
     * 将指定实体保存到Redis中，数据格式为字符串，且可以设置过期时间
     *
     * @param key
     * @param t
     * @param <T>
     * @param expireTime 过期时间，以秒为单位
     * @return boolean
     */
    <T> boolean saveToString(RedisKeyEnum key, T t, long expireTime);


    /**
     * 将指定实体保存到Redis中，数据格式为Map
     *
     * @param key
     * @param t
     * @return boolean
     */
    <V> boolean saveToMap(RedisKeyEnum key, Map<String, V> t);

    /**
     * 将指定实体保存到Redis中，数据格式为Map，且可以设置过期时间
     *
     * @param key
     * @param t
     * @param expireTime 过期时间，以秒为单位
     * @return boolean
     */
    <V> boolean saveToMap(RedisKeyEnum key, Map<String, V> t, long expireTime);

    /**
     * 获取所有的key
     *
     * @return List<String>
     */
    List<String> getKey();

    /**
     * 查询指定key的值，存储方式为字符串
     *
     * @param keyEnum
     * @return String
     */
    String getString(RedisKeyEnum keyEnum);

    /**
     * 查询指定key的值，存储方式为字符串，并将其转换为指定的Class对象
     *
     * @param keyEnum
     * @param <T>
     * @return T
     */
    <T> T getFromString(RedisKeyEnum keyEnum, Class<T> clazz);

    /**
     * 查询指定key的值，存储方式为Map
     *
     * @param keyEnum
     * @return Map<Object, Object>
     */
    Map<Object, Object> getFromMap(RedisKeyEnum keyEnum);

    /**
     * 查询指定key的值，存储方式为Map，并将其转换为指定的Class对象
     *
     * @param keyEnum redis的键
     * @param mapKey  map集合的键
     * @return 返回null表示不存在
     */
    <T> T getFromMap(RedisKeyEnum keyEnum, String mapKey, Class<T> clazz);

    /**
     * 从Map集合中删除指定的key
     *
     * @param keyEnum
     * @return boolean
     */
    boolean removeFromMap(RedisKeyEnum keyEnum, Object... key);

    /**
     * 删除指定的缓存
     *
     * @param keyEnum
     * @return boolean
     */
    boolean delete(RedisKeyEnum keyEnum);


    /**
     * 对指定的key值，进行递增操作
     *
     * @param keyEnum   redis的键
     * @param keySuffix redis的键后缀
     * @param delta     增量
     * @param time      过期时长 小于等于0时不会设置过期
     * @param timeUnit  过期时长单位
     * @return long
     */
    long increment(RedisKeyEnum keyEnum, String keySuffix, long delta, long time, TimeUnit timeUnit);
}
